]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/tray-manager: Allow to unmanage screen
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 4 Mar 2020 22:26:15 +0000 (23:26 +0100)
committerFlorian Müllner <florian.muellner@gmail.com>
Fri, 6 Mar 2020 18:45:21 +0000 (18:45 +0000)
Since support for legacy status icons is implemented by extensions
nowadays, they need to undo the call to manage_screen() when they
are disabled.

Right now that means bypassing garbage collection with an explicit
call to run_dispose() on the Shell.TrayManager. That works, but is
rather ugly.

An explicit unmanage_screen() method is a nicer option, and will be
useful to us as well to deal with X11 going away (once Xwayland
crashes don't bring down the entire session).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/2308

src/shell-tray-manager.c
src/shell-tray-manager.h

index 269682bcffecd28a297189e1accc08aeafb9a416..ea7066be67be8993feea21ae79473bc53e262234 100644 (file)
@@ -29,6 +29,7 @@ struct _ShellTrayManagerPrivate {
   ClutterColor bg_color;
 
   GHashTable *icons;
+  StWidget *theme_widget;
 };
 
 typedef struct {
@@ -228,6 +229,8 @@ void
 shell_tray_manager_manage_screen (ShellTrayManager *manager,
                                   StWidget         *theme_widget)
 {
+  g_set_weak_pointer (&manager->priv->theme_widget, theme_widget);
+
   shell_tray_manager_ensure_resources (manager);
 
   na_tray_manager_manage_screen (manager->priv->na_manager);
@@ -238,6 +241,20 @@ shell_tray_manager_manage_screen (ShellTrayManager *manager,
   shell_tray_manager_style_changed (theme_widget, manager);
 }
 
+void
+shell_tray_manager_unmanage_screen (ShellTrayManager *manager)
+{
+  if (manager->priv->theme_widget != NULL)
+    {
+      g_signal_handlers_disconnect_by_func (manager->priv->theme_widget,
+                                            G_CALLBACK (shell_tray_manager_style_changed),
+                                            manager);
+    }
+  g_set_weak_pointer (&manager->priv->theme_widget, NULL);
+
+  shell_tray_manager_release_resources (manager);
+}
+
 static void
 shell_tray_manager_child_on_realize (GtkWidget             *widget,
                                      ShellTrayManagerChild *child)
index 2e4c0f7bba711ce53c0598aca635ca40c1eca5de..d6279d47c695c4b7d1cf98ef049360921bbbcf50 100644 (file)
@@ -15,6 +15,7 @@ G_DECLARE_FINAL_TYPE (ShellTrayManager, shell_tray_manager,
 ShellTrayManager *shell_tray_manager_new          (void);
 void              shell_tray_manager_manage_screen (ShellTrayManager *manager,
                                                     StWidget         *theme_widget);
+void              shell_tray_manager_unmanage_screen (ShellTrayManager *manager);
 
 G_END_DECLS